{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# tensorflow2.0教程-文本分类\n",
    "\n",
    "我们将构建一个简单的文本分类器，并使用IMDB进行训练和测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0-alpha0\n"
     ]
    }
   ],
   "source": [
    "from __future__ import absolute_import, division, print_function\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.IMDB数据集\n",
    "\n",
    "下载"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "imdb=keras.datasets.imdb\n",
    "(train_x, train_y), (test_x, text_y)=keras.datasets.imdb.load_data(num_words=10000)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "了解IMDB数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training entries: 25000, labels: 25000\n",
      "[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]\n",
      "len:  218 189\n"
     ]
    }
   ],
   "source": [
    "print(\"Training entries: {}, labels: {}\".format(len(train_x), len(train_y)))\n",
    "\n",
    "print(train_x[0])\n",
    "print('len: ',len(train_x[0]), len(train_x[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "创建id和词的匹配字典"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<START> this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert <UNK> is an amazing actor and now the same being director <UNK> father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for <UNK> and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also <UNK> to the two little boy's that played the <UNK> of norman and paul they were just brilliant children are often left out of the <UNK> list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\n"
     ]
    }
   ],
   "source": [
    "word_index = imdb.get_word_index()\n",
    "\n",
    "word2id = {k:(v+3) for k, v in word_index.items()}\n",
    "word2id['<PAD>'] = 0\n",
    "word2id['<START>'] = 1\n",
    "word2id['<UNK>'] = 2\n",
    "word2id['<UNUSED>'] = 3\n",
    "\n",
    "id2word = {v:k for k, v in word2id.items()}\n",
    "def get_words(sent_ids):\n",
    "    return ' '.join([id2word.get(i, '?') for i in sent_ids])\n",
    "\n",
    "sent = get_words(train_x[0])\n",
    "print(sent)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2.准备数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[   1   14   22   16   43  530  973 1622 1385   65  458 4468   66 3941\n",
      "    4  173   36  256    5   25  100   43  838  112   50  670    2    9\n",
      "   35  480  284    5  150    4  172  112  167    2  336  385   39    4\n",
      "  172 4536 1111   17  546   38   13  447    4  192   50   16    6  147\n",
      " 2025   19   14   22    4 1920 4613  469    4   22   71   87   12   16\n",
      "   43  530   38   76   15   13 1247    4   22   17  515   17   12   16\n",
      "  626   18    2    5   62  386   12    8  316    8  106    5    4 2223\n",
      " 5244   16  480   66 3785   33    4  130   12   16   38  619    5   25\n",
      "  124   51   36  135   48   25 1415   33    6   22   12  215   28   77\n",
      "   52    5   14  407   16   82    2    8    4  107  117 5952   15  256\n",
      "    4    2    7 3766    5  723   36   71   43  530  476   26  400  317\n",
      "   46    7    4    2 1029   13  104   88    4  381   15  297   98   32\n",
      " 2071   56   26  141    6  194 7486   18    4  226   22   21  134  476\n",
      "   26  480    5  144   30 5535   18   51   36   28  224   92   25  104\n",
      "    4  226   65   16   38 1334   88   12   16  283    5   16 4472  113\n",
      "  103   32   15   16 5345   19  178   32    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0]\n",
      "len:  256 256\n"
     ]
    }
   ],
   "source": [
    "# 句子末尾padding\n",
    "train_x = keras.preprocessing.sequence.pad_sequences(\n",
    "    train_x, value=word2id['<PAD>'],\n",
    "    padding='post', maxlen=256\n",
    ")\n",
    "test_x = keras.preprocessing.sequence.pad_sequences(\n",
    "    test_x, value=word2id['<PAD>'],\n",
    "    padding='post', maxlen=256\n",
    ")\n",
    "print(train_x[0])\n",
    "print('len: ',len(train_x[0]), len(train_x[1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.构建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding (Embedding)        (None, None, 16)          160000    \n",
      "_________________________________________________________________\n",
      "global_average_pooling1d (Gl (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 16)                272       \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 17        \n",
      "=================================================================\n",
      "Total params: 160,289\n",
      "Trainable params: 160,289\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "import tensorflow.keras.layers as layers\n",
    "vocab_size = 10000\n",
    "model = keras.Sequential()\n",
    "model.add(layers.Embedding(vocab_size, 16))\n",
    "model.add(layers.GlobalAveragePooling1D())\n",
    "model.add(layers.Dense(16, activation='relu'))\n",
    "model.add(layers.Dense(1, activation='sigmoid'))\n",
    "model.summary()\n",
    "model.compile(optimizer='adam',\n",
    "             loss='binary_crossentropy',\n",
    "             metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.模型训练与验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 15000 samples, validate on 10000 samples\n",
      "Epoch 1/40\n",
      "15000/15000 [==============================] - 1s 73us/sample - loss: 0.6919 - accuracy: 0.5071 - val_loss: 0.6901 - val_accuracy: 0.5101\n",
      "Epoch 2/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.6864 - accuracy: 0.6242 - val_loss: 0.6829 - val_accuracy: 0.6380\n",
      "Epoch 3/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.6752 - accuracy: 0.6881 - val_loss: 0.6691 - val_accuracy: 0.7091\n",
      "Epoch 4/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.6559 - accuracy: 0.7162 - val_loss: 0.6471 - val_accuracy: 0.7509\n",
      "Epoch 5/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.6274 - accuracy: 0.7697 - val_loss: 0.6175 - val_accuracy: 0.7724\n",
      "Epoch 6/40\n",
      "15000/15000 [==============================] - 1s 43us/sample - loss: 0.5909 - accuracy: 0.8049 - val_loss: 0.5821 - val_accuracy: 0.7869\n",
      "Epoch 7/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.5490 - accuracy: 0.8208 - val_loss: 0.5418 - val_accuracy: 0.8158\n",
      "Epoch 8/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.5054 - accuracy: 0.8437 - val_loss: 0.5030 - val_accuracy: 0.8285\n",
      "Epoch 9/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.4630 - accuracy: 0.8557 - val_loss: 0.4662 - val_accuracy: 0.8400\n",
      "Epoch 10/40\n",
      "15000/15000 [==============================] - 1s 49us/sample - loss: 0.4239 - accuracy: 0.8707 - val_loss: 0.4345 - val_accuracy: 0.8470\n",
      "Epoch 11/40\n",
      "15000/15000 [==============================] - 1s 46us/sample - loss: 0.3896 - accuracy: 0.8772 - val_loss: 0.4070 - val_accuracy: 0.8563\n",
      "Epoch 12/40\n",
      "15000/15000 [==============================] - 1s 47us/sample - loss: 0.3599 - accuracy: 0.8867 - val_loss: 0.3856 - val_accuracy: 0.8594\n",
      "Epoch 13/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.3352 - accuracy: 0.8925 - val_loss: 0.3660 - val_accuracy: 0.8646\n",
      "Epoch 14/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.3131 - accuracy: 0.8978 - val_loss: 0.3517 - val_accuracy: 0.8697\n",
      "Epoch 15/40\n",
      "15000/15000 [==============================] - 1s 48us/sample - loss: 0.2947 - accuracy: 0.9013 - val_loss: 0.3392 - val_accuracy: 0.8716\n",
      "Epoch 16/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.2782 - accuracy: 0.9077 - val_loss: 0.3293 - val_accuracy: 0.8747\n",
      "Epoch 17/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.2632 - accuracy: 0.9126 - val_loss: 0.3208 - val_accuracy: 0.8757\n",
      "Epoch 18/40\n",
      "15000/15000 [==============================] - 1s 43us/sample - loss: 0.2500 - accuracy: 0.9159 - val_loss: 0.3132 - val_accuracy: 0.8800\n",
      "Epoch 19/40\n",
      "15000/15000 [==============================] - 1s 46us/sample - loss: 0.2381 - accuracy: 0.9197 - val_loss: 0.3073 - val_accuracy: 0.8792\n",
      "Epoch 20/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.2274 - accuracy: 0.9229 - val_loss: 0.3029 - val_accuracy: 0.8801\n",
      "Epoch 21/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.2167 - accuracy: 0.9277 - val_loss: 0.2992 - val_accuracy: 0.8811\n",
      "Epoch 22/40\n",
      "15000/15000 [==============================] - 1s 43us/sample - loss: 0.2077 - accuracy: 0.9299 - val_loss: 0.2951 - val_accuracy: 0.8835\n",
      "Epoch 23/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.1986 - accuracy: 0.9335 - val_loss: 0.2931 - val_accuracy: 0.8827\n",
      "Epoch 24/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.1907 - accuracy: 0.9371 - val_loss: 0.2911 - val_accuracy: 0.8835\n",
      "Epoch 25/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.1828 - accuracy: 0.9415 - val_loss: 0.2885 - val_accuracy: 0.8841\n",
      "Epoch 26/40\n",
      "15000/15000 [==============================] - 1s 43us/sample - loss: 0.1756 - accuracy: 0.9436 - val_loss: 0.2884 - val_accuracy: 0.8840\n",
      "Epoch 27/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.1689 - accuracy: 0.9463 - val_loss: 0.2870 - val_accuracy: 0.8836\n",
      "Epoch 28/40\n",
      "15000/15000 [==============================] - 1s 41us/sample - loss: 0.1624 - accuracy: 0.9497 - val_loss: 0.2870 - val_accuracy: 0.8853\n",
      "Epoch 29/40\n",
      "15000/15000 [==============================] - 1s 46us/sample - loss: 0.1568 - accuracy: 0.9523 - val_loss: 0.2872 - val_accuracy: 0.8840\n",
      "Epoch 30/40\n",
      "15000/15000 [==============================] - 1s 43us/sample - loss: 0.1509 - accuracy: 0.9534 - val_loss: 0.2864 - val_accuracy: 0.8858\n",
      "Epoch 31/40\n",
      "15000/15000 [==============================] - 1s 43us/sample - loss: 0.1449 - accuracy: 0.9567 - val_loss: 0.2866 - val_accuracy: 0.8858\n",
      "Epoch 32/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.1395 - accuracy: 0.9595 - val_loss: 0.2874 - val_accuracy: 0.8856\n",
      "Epoch 33/40\n",
      "15000/15000 [==============================] - 1s 43us/sample - loss: 0.1343 - accuracy: 0.9600 - val_loss: 0.2888 - val_accuracy: 0.8863\n",
      "Epoch 34/40\n",
      "15000/15000 [==============================] - 1s 44us/sample - loss: 0.1297 - accuracy: 0.9623 - val_loss: 0.2903 - val_accuracy: 0.8843\n",
      "Epoch 35/40\n",
      "15000/15000 [==============================] - 1s 43us/sample - loss: 0.1255 - accuracy: 0.9630 - val_loss: 0.2915 - val_accuracy: 0.8870\n",
      "Epoch 36/40\n",
      "15000/15000 [==============================] - 1s 42us/sample - loss: 0.1208 - accuracy: 0.9659 - val_loss: 0.2928 - val_accuracy: 0.8862\n",
      "Epoch 37/40\n",
      "15000/15000 [==============================] - 1s 48us/sample - loss: 0.1162 - accuracy: 0.9679 - val_loss: 0.2949 - val_accuracy: 0.8851\n",
      "Epoch 38/40\n",
      "15000/15000 [==============================] - 1s 49us/sample - loss: 0.1121 - accuracy: 0.9691 - val_loss: 0.2975 - val_accuracy: 0.8848\n",
      "Epoch 39/40\n",
      "15000/15000 [==============================] - 1s 49us/sample - loss: 0.1088 - accuracy: 0.9697 - val_loss: 0.3003 - val_accuracy: 0.8840\n",
      "Epoch 40/40\n",
      "15000/15000 [==============================] - 1s 45us/sample - loss: 0.1046 - accuracy: 0.9721 - val_loss: 0.3022 - val_accuracy: 0.8843\n",
      "25000/25000 [==============================] - 1s 22us/sample - loss: 0.3216 - accuracy: 0.8729\n",
      "[0.32155542838573453, 0.87292]\n"
     ]
    }
   ],
   "source": [
    "x_val = train_x[:10000]\n",
    "x_train = train_x[10000:]\n",
    "\n",
    "y_val = train_y[:10000]\n",
    "y_train = train_y[10000:]\n",
    "\n",
    "history = model.fit(x_train,y_train,\n",
    "                   epochs=40, batch_size=512,\n",
    "                   validation_data=(x_val, y_val),\n",
    "                   verbose=1)\n",
    "\n",
    "result = model.evaluate(test_x, text_y)\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "## 5.查看准确率时序图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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6zu9PnHiRG677TYGDRrEAQccwNixY1vwDerde++9nHvuuWzZsoV9992Xu+++mx07dnD66aezceNG3J3vf//7dOvWjSuuuIIFCxbQpk0bhgwZwtFHH52VGOqY56bnYlqjRo3y1pysY/ZsOOccSLzY3aED3HGH7nAVybbXX3+dQYMGxR1GwUt2Hs3sBXcfle69RVWWSaWyMiTyxJb6yJFwyin167rDVUSKRckkdwgJfuXKUJP/8Y/hmWfgm9+ETz9VbxoRKS5FX3NPxizU9zp3hgsvhEmT4PXXG+9No7KNiBSakkzudS64ALp0CbX42trk+6g3jYgUopIqyyTz7W/Dg42OY6neNCJSmEo+uUOou19yya7bW9rXVkQkLkrukeuvh8svD/V4CC32WbNUbxcpFZ07d27S9nyn5J5g5kx46KHw/BvfUGIXkcKl5N7A5MmhRHPrrXDffXFHIyLNMW3aNG699dbP1+sm1Ni8eTNf+cpXOOSQQxg6dCi/+93vMj6mu3PppZdy0EEHMXToUB6KWoIffPABhx12GMOHD+eggw7i6aefZseOHZx11lmf73vjjTdm/TumU9K9ZRrzk5/AokWhn/vQoRANCicizXDhhbB4cXaPOXw43HRT46+fcsopXHjhhZx33nkAzJ07l/nz59O+fXsefvhhunbtytq1axk7diyTJk3KaL7S3/zmNyxevJglS5awdu1aRo8ezWGHHcYDDzzA1772NaZPn86OHTvYsmULixcvprq6mldffRWgSTM7ZYta7km0bRvKM3vuCSedBNF4+7qDVaRAjBgxgjVr1vD++++zZMkSunfvTv/+/XF3Lr/8coYNG8aRRx5JdXU1q1evzuiYzzzzDKeeeiplZWX07t2b8ePHs3DhQkaPHs3dd9/NjBkzeOWVV+jSpQv77rsvy5cv53vf+x5/+tOf6Nq1a46/8a7Ucm9E794wbx6MHw///M9hmIJzz62/0anuDlZQbV4klVQt7FyaPHky8+bN48MPP+SUaJyR2bNnU1NTwwsvvEC7du2oqKhIOtRvUxx22GE89dRTPProo5x11llcfPHFnHHGGSxZsoT58+dz2223MXfuXO66665sfK2MqeWewpe+BDfeCI8+Ct/7nsaDFykkp5xyCnPmzGHevHlMnjwZCEP97rXXXrRr144FCxawcuXKjI936KGH8tBDD7Fj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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "history_dict = history.history\n",
    "history_dict.keys()\n",
    "acc = history_dict['accuracy']\n",
    "val_acc = history_dict['val_accuracy']\n",
    "loss = history_dict['loss']\n",
    "val_loss = history_dict['val_loss']\n",
    "epochs = range(1, len(acc)+1)\n",
    "\n",
    "plt.plot(epochs, loss, 'bo', label='train loss')\n",
    "plt.plot(epochs, val_loss, 'b', label='val loss')\n",
    "plt.title('Train and val loss')\n",
    "plt.xlabel('Epochs')\n",
    "plt.xlabel('loss')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.clf()   # clear figure\n",
    "\n",
    "plt.plot(epochs, acc, 'bo', label='Training acc')\n",
    "plt.plot(epochs, val_acc, 'b', label='Validation acc')\n",
    "plt.title('Training and validation accuracy')\n",
    "plt.xlabel('Epochs')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
